package luogu;

import java.io.*;
import java.util.Scanner;



//# P8642 [蓝桥杯 2016 国 AC] 路径之谜
//
//## 题目描述
//
//小明冒充 $X$ 星球的骑士，进入了一个奇怪的城堡。
//
//城堡里边什么都没有，只有方形石头铺成的地面。
//
//假设城堡地面是 $n\times n$ 个方格。如图所示。
//
//        ![](https://cdn.luogu.com.cn/upload/image_hosting/ku6hk346.png)
//
//按习俗，骑士要从西北角走到东南角。
//
//可以横向或纵向移动，但不能斜着走，也不能跳跃。
//
//每走到一个新方格，就要向正北方和正西方各射一箭。
//
//        （城堡的西墙和北墙内各有 $n$ 个靶子）
//
//同一个方格只允许经过一次。但不必做完所有的方格。
//
//如果只给出靶子上箭的数目，你能推断出骑士的行走路线吗？
//
//有时是可以的，比如如图中的例子。
//
//本题的要求就是已知箭靶数字，求骑士的行走路径（测试数据保证路径唯一）
//
//        ## 输入格式
//
//第一行一个整数 $N(0<N<20)$，表示地面有 $N \times N$ 个方格。
//
//第二行 $N$ 个整数，空格分开，表示北边的箭靶上的数字（自西向东）
//
//第三行 $N$ 个整数，空格分开，表示西边的箭靶上的数字（自北向南）
//
//        ## 输出格式
//
//一行若干个整数，表示骑士路径。
//
//为了方便表示，我们约定每个小格子用一个数字代表，从西北角开始编号 $:0,1,2,3 \cdots $。
//
//比如，图中的方块编号为：
//
//        ```
//        0  1  2  3
//        4  5  6  7
//        8  9  10 11
//        12 13 14 15
//        ```
//
//        ## 输入输出样例 #1
//
//        ### 输入 #1
//
//        ```
//        4
//        2 4 3 4
//        4 3 3 3
//        ```
//
//        ### 输出 #1
//
//        ```
//        0 4 5 1 2 3 7 11 10 9 13 14 15
//        ```
//
//        ## 说明/提示
//
//时限 1 秒, 256M。蓝桥杯 2016 年第七届国赛

















public class A8642 {
    static int N=22;
  static  int[][] map=new int[N][N];
    static int n;
    static int [] s;//上边
    static int [] b;//左边
    static int [] load;//路径保存
    //static int by=0;//走过的步数
    static int[] fx1 = {-1, 0, 1, 0}; // 北、东、南、西
    static int[] fx2 = {0, 1, 0, -1}; // 西、南、东、北
    static int [][] vis;
    static BufferedReader read=new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter log=new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        n = Integer.parseInt(read.readLine());
        b=new int[n];
        s=new int[n];
        load=new int[n*n];//存储路径
        String[] sStr = read.readLine().split(" ");
        String[] bStr = read.readLine().split(" ");

        for(int i=0;i<n;i++){
            s[i]=Integer.parseInt(sStr[i]);
            b[i]=Integer.parseInt(bStr[i]);
        }
        for(int i=0;i<=n*n-1;i++){
            map[i/n][i%n]=i;//初始化地图
        }
        vis=new int[n][n];//标记数组
        vis[0][0]=1;//将原点标记为已经走了
        load[0]=0;
        dfs(0,0,1);//从原点往四周搜索

        read.close();
        log.close();
    }
 static   boolean empty(){
        for(int i=0;i<n;i++){
            if(b[i]!=0||s[i]!=0)return false;//说明不是正确路径
        }
        return true;
    }
static void dfs(int x,int y,int u) throws IOException {//,xy代表已经到达且现在位于的位置，u代表往路径数组插入的位置
   //走到了该位置，先把箭数减少
    s[y]--;
    b[x]--;
    //如果还没走到终点但是把墙上的箭减掉了，说明这条路径不可行,恢复现场返回(剪枝)(必要的剪枝)
    if (s[y] < 0 || b[x] < 0) {
        s[y]++;
        b[x]++;
        return;
    }

    if (x == n - 1 && y == n - 1) {
        if (empty()) {
            for (int i = 0; i < u; i++) {
                log.write(load[i] + " ");
            }
            log.flush();

            //return;
             System.exit(0); // 找到唯一解后直接退出
        }

        // 恢复箭靶数后返回
        s[y]++;
        b[x]++;
        return;
    }

    //枚举四周
    for(int i=0;i<4;i++){
        int xx=x+fx1[i];
        int yy=y+fx2[i];
        if(xx>=0&&xx<n&&yy>=0&&yy<n&&vis[xx][yy]==0){//没被走过
            //那么可以走这条路
            vis[xx][yy]=1;//标记这个位置走过了
            load[u]=xx*n+yy;
            dfs(xx,yy,u+1);
                vis[xx][yy]=0;//恢复现场
        }
    }
    //恢复现场
    s[y]++;
    b[x]++;
}
}
